package com.zhb.cloud.core.component;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName: RedisUtil
 * @Description: redis处理缓存的核心工具类
 * @author: zhb zhb1316783262@163.com
 * @date: 2017年11月14日 下午4:08:14
 */
@Component
public class RedisUtil {
	@Autowired
	private RedisTemplate<String, Object> redisTemplate;

	/**
	 * @Description: 如果SETNX返回1，则客户端获得该锁，SETNX将键 key 的值设置为锁的超时时间（当前时间 +
	 *               锁的有效时间）。客户端稍后将使用DEL lock.foo来释放锁。
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午6:21:11
	 * @param key
	 * @param value
	 * @return
	 */
	public boolean setNX(String key, Object value) {
		ValueOperations<String, Object> operations = redisTemplate.opsForValue();
		return operations.setIfAbsent(key, value);
	}

	/**
	 * @Description:缓存中获取数据
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:47:28
	 * @param key
	 * @return
	 */
	public Object get(String key) {
		ValueOperations<String, Object> operations = redisTemplate.opsForValue();
		Object object = operations.get(key);
		if (object == null) {
			return 0;
		}
		return object;
	}

	/**
	 * @Description: 返回一个字符串，也就是键的旧值。 如果键不存在，则返回nil
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:46:54
	 * @param key
	 * @param value
	 * @return
	 */
	public Object getAndSet(String key, Object value) {
		Object set = redisTemplate.opsForValue().getAndSet(key, value);
		if (set == null) {
			return 0;
		}
		return set;
	}

	/**
	 * @Description: 设置key的过期时间
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:24:21
	 * @param key
	 * @param l
	 */
	public void expire(String key, long l) {
		redisTemplate.expire(key, l, TimeUnit.SECONDS);
	}

	/**
	 * @Description: 删除对应的value(单个)
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:24:46
	 * @param key
	 */
	public void delete(final String key) {
		if (exists(key)) {
			redisTemplate.delete(key);
		}
	}

	/**
	 * @Description: 判断缓存中是否有对应的value
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:25:14
	 * @param key
	 * @return
	 */
	public boolean exists(final String key) {
		return redisTemplate.hasKey(key);
	}

	/**
	 * @Description: 设置key的value
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:25:29
	 * @param key
	 * @param value
	 * @return
	 */
	public boolean set(final String key, Object value) {
		boolean result = false;
		try {
			redisTemplate.opsForValue().set(key, value);
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 
	 * @Description: 设置key的value并设置时效时间
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:26:32
	 * @param key
	 * @param value
	 * @param expireTime
	 * @return
	 */
	public boolean set(final String key, Object value, Long expireTime) {
		boolean result = false;
		try {
			redisTemplate.opsForValue().set(key, value);
			redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * @Description:删除批量key对应的value
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:27:47
	 * @param keys
	 */
	public void remove(List<String> keys) {
		if (keys != null && keys.size() > 0) {
			redisTemplate.delete(keys);
		}
	}

	/**
	 * @Description: 批量删除key
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:27:57
	 * @param pattern
	 */
	public void removePattern(final String pattern) {
		Set<String> keys = redisTemplate.keys(pattern);
		if (keys.size() > 0) {
			redisTemplate.delete(keys);
		}
	}

	/**
	 * @Description: hash数据类型 添加数据(hashoprations)
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:45:01
	 * @param key
	 * @param hashKey
	 * @return
	 */
	public void hashSet(String key, Object hashKey, Object value) {
		HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
		hash.put(key, hashKey, value);
	}

	/**
	 * @Description: hash数据类型 获取数据(hashoprations)
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:45:01
	 * @param key
	 * @param hashKey
	 * @return
	 */
	public Object hashGet(String key, Object hashKey) {
		HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
		return hash.get(key, hashKey);
	}

	/**
	 * 
	 * @Description: 在list为key的list后面追加
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:35:39
	 * @param key
	 * @param value
	 */
	public void leftPush(String key, Object value) {
		redisTemplate.opsForList().leftPush(key, value);
	}

	/**
	 * @Description:列表获取--从当前key的list中获取指定数据
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:36:58
	 * @param key
	 * @param start
	 * @param end
	 * @return
	 */
	public List<Object> range(String key, long start, long end) {
		return redisTemplate.opsForList().range(key, start, end);
	}

	/**
	 * @Description: set集合添加
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:40:28
	 * @param key
	 * @param value
	 */
	public void add(String key, Object value) {
		redisTemplate.opsForSet().add(key, value);
	}

	/**
	 * @Description:获取key值为当前key的set集合
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:40:47
	 * @param key
	 * @return
	 */
	public Set<Object> setMembers(String key) {
		return redisTemplate.opsForSet().members(key);
	}

	/**
	 * @Description: zset 有序集合添加(ZSetOperations)
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:41:54
	 * @param key
	 * @param value
	 * @param scoure
	 */
	public void zAdd(String key, Object value, double scoure) {
		redisTemplate.opsForZSet().add(key, value, scoure);
	}

	/**
	 * @Description:zset有序集合 根据key获取指定范围元素
	 * @author: zhb zhb1316783262@163.com
	 * @date: 2017年11月14日 下午4:43:20
	 * @param key
	 * @param scoure
	 * @param scoure1
	 * @return
	 */
	public Set<Object> rangeByScore(String key, double min, double max) {
		return redisTemplate.opsForZSet().rangeByScore(key, min, max);
	}
}
